// 该程序中使用vfork函数替代fork函数来创建子进程，由于vfork函数会自动让子进程先运行
// 所有不需要父进程调用sleep函数组织自身运行

/**************************************
 * vfork函数的返回和fork类似，父进程中返回子进程的进程号，在子进程中返回0，若出错则返回-1
 * fork 和 vfork 之间的区别如下：
 * 1、 fork要拷贝父进程的数据段；而vfork则不需要完全拷贝父进程的数据段，在子进程没有调用exec系列函数或
 *	exit函数之前，子进程与父进程共享数据段
 * 2、vfork函数会自动调用exec系列函数去执行另一个程序
 * 3、fork不对父子进程的执行次序进行任何限制；而在vfork调用中，子进程先运行，父进程挂起，
 *      直到子进程调用了exec系列函数或exit之后，父子进程的执行次序才不再有限制
 * */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]){
	
	pid_t pid;

	// 创建变量，用来观察子进程和父进程的先后顺序
	int var, glob;
	 
	var = 88;
	glob = 7;

	printf("创建子进程前!\n"); 
	
	// 使用vfork函数重建子进程
	pid = vfork();

	if(pid < 0){
		printf("子进程创建失败!\n");
		return -2;
	}else if(pid == 0){
		printf("现在为子进程运行!\n");
		var++;
		glob++;
	}else{
		printf("现在为父进程运行！\n");
	}

	printf("进程标志符为：%d, glob = %d, var = %d\n", getpid(), glob, var);

	// 要使用exit(0)函数，exit(0)表示正常退出一个进程，exit(1)表示异常退出一个进程
	// 如果使用return函数则会报错
	exit(0);
	//return 0;
}
